<?php
/**
 * 前端控制器 - 基础类。
 *
 */
class BasePage {
	/**
	 * 数据集合。
	 *
	 * @var array
	 */
	private $data = array();
	
	/**
	 * Smarty 对象。
	 *
	 * @var Smarty
	 */
	protected $template = NULL;
	
	/**
	 * PDO 对象。
	 *
	 * @var LeeNT_MySql
	 */
	protected $db = NULL;
	
	/**
	 * POST 行为标识。
	 *
	 * @var string
	 */
	protected $action = NULL;
	
	/**
	 * 当前视图标识。
	 *
	 * @var string
	 */
	protected $view = NULL;
	
	/**
	 * 标识是否 POST 请求类型。
	 *
	 * @var boolean
	 */
	protected $isPostback = false;
	
	/**
	 * 表单 POST 数据集合。
	 *
	 * @var array
	 */
	protected $forms = NULL;
	
	/**
	 * 请求 $_GET 数据集合。
	 *
	 * @var array
	 */
	protected $queries = NULL;
	
	/**
	 * 当前系统时间。
	 *
	 * @var int
	 */
	protected $currentTime = 0;
	
	/**
	 * Session 对象实例。
	 *
	 * @var Front_Session
	 */
	protected $session = NULL;
	
	/**
	 * 标识是否登录。
	 *
	 * @var boolean
	 */
	protected $isLogined = false;
	
	/**
	 * 构造函数。
	 *
	 */
	function __construct() {
		global $db;
		
		$this->currentTime = time();
		
		$this->db = &$db;
		
		$this->addslashes($_POST);
		$this->addslashes($_GET);
		
		$this->forms = &$_POST;
		$this->queries = &$_GET;
		
		if (strcmp('POST', $_SERVER['REQUEST_METHOD']) === 0) {
			$this->isPostback = true;
		}
		
		$this->action = empty($this->forms['action']) ? (empty($this->queries['action']) ? NULL : $this->queries['action']) : $this->forms['action'];
		$this->view = $this->queries['v'];
		
		$this->initSession();
	}
	
	/**
	 * 初始化 Session 对象。
	 *
	 */
	function initSession() {
		if (!empty($_SESSION['TBG_U_SESS'])) {
			include (CLASS_PATH . 'front' . DS . 'Session.class.php');
			
			$this->session = new Front_Session();
			$this->session->UserId = $_SESSION['TBG_U_SESS'][0];
			$this->session->Username = $_SESSION['TBG_U_SESS'][1];
			$this->session->Nickname = $_SESSION['TBG_U_SESS'][2];
			$this->session->IsMaster = $_SESSION['TBG_U_SESS'][3] == 1 ? true : false;
			
			$this->isLogined = true;
		}
	}
	
	/**
	 * 初始化 Smarty 对象实例。
	 *
	 */
	function initSmarty() {
		global $cfgs;
		
		include (LIBRARY_PATH . 'Smarty/Smarty.class.php');
		
		if (strpos($this->queries['do'], 'admin.') !== false) {
			$cfgs['skin'] = 'admin';
		}
		$cfgs['base'] = '/blog/site-content/' . $cfgs['skin'] . '/';
		
		$this->template = &new Smarty();
		$this->template->setTemplateDir(DOC_ROOT . 'templates/' . $cfgs['skin'] . '/');
		$this->template->compile_dir = DOC_ROOT . 'templates_c/' . $cfgs['skin'] . '/';
		$this->template->left_delimiter = '<!--{';
		$this->template->right_delimiter = '}-->';
	}
	
	/**
	 * 模版变量赋值。
	 *
	 * @param string $var
	 * @param mixed $val
	 */
	function assign($var, $val) {
		if (is_null($this->template)) {
			$this->initSmarty();
		}
		
		$this->template->assign($var, $val);
	}
	
	/**
	 * 输出视图。
	 *
	 * @param string $filename
	 */
	function display($filename) {
		global $cfgs;
		
		if (is_null($this->template)) {
			$this->initSmarty();
		}
		
		if ($this->isLogined) {
			$this->assign('Session', array(
				'Online' => $this->isLogined, 
				'UserId' => $this->session->UserId, 
				'Username' => $this->session->Username, 
				'Uickname' => $this->session->Nickname
			));
		}
		
		$this->assign('cfgs', $cfgs);
		$this->assign('envs', array(
			'uri' => $_SERVER['REQUEST_URI']
		));
		
		$this->template->display($filename . '.tpl.html');
	}
	
	/**
	 * 输出 Ajax 结果信息。
	 *
	 * @param int $code
	 * @param string $description
	 * @param array $extra_data
	 */
	function displayAjax($code = 200, $description = '', $extra_data = NULL) {
		$d = array(
			'code' => $code, 
			'description' => $description, 
			'extraData' => $extra_data
		);
		
		echo json_encode($d);
		exit(0);
	}
	
	/**
	 * 打印错误信息。
	 *
	 * @param int $code
	 * @param mixed $errmsg
	 */
	function displayErrors($code = 0, $errmsg = '') {
		echo $errmsg;
		exit(0);
	}
	
	/**
	 * 数据转义处理。
	 *
	 * @param mixed $var
	 */
	function addslashes(&$var, $add_quotes = false) {
		if (empty($var)) return;
		
		$gpc = get_magic_quotes_gpc();
		
		if (is_array($var)) {
			foreach ($var as $key => $value) {
				if (is_array($value)) {
					$this->addslashes($var[$key]);
				} elseif (is_string($value)) {
					if ($add_quotes) {
						if ($gpc) {
							$var[$key] = trim($value);
						} else {
							$var[$key] = trim(addslashes($value));
						}
					} else {
						if ($gpc) {
							$var[$key] = trim(stripslashes($value));
						} else {
							$var[$key] = trim($value);
						}
					}
				}
			}
		} elseif (is_string($var)) {
			if ($add_quotes) {
				if ($gpc) {
					$var[$key] = trim($value);
				} else {
					$var[$key] = trim(addslashes($value));
				}
			} else {
				if ($gpc) {
					$var[$key] = trim(stripslashes($value));
				} else {
					$var[$key] = trim($value);
				}
			}
		}
	}
	
	/**
	 * 重定向到指定页面。
	 *
	 * @param string $url
	 * @param string $view
	 * @param array $params
	 */
	function go($url = NULL, $view = NULL, $params = NULL) {
		if (!empty($url) && !is_null($view)) {
			$url = 'dispatcher.php?do=' . $url;
			
			if ('' != trim($view)) {
				$url .= '&v=' . $view;
			}
			
			if (!empty($params) && is_array($params)) {
				$url .= '&' . http_build_query($params);
			}
		}
		
		if (is_null($url)) {
			header('Location: ' . $_SERVER['HTTP_REFERER']);
		} else {
			header('Location: ' . $url);
		}
		exit(0);
	}
	
	/**
	 * 显示错误信息。
	 *
	 * @param string $errors
	 */
	function showErrors($errors) {
		$this->assign('errors', $errors);
		$this->display('error');
		exit(0);
	}
}